Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Alpha-Beta-Suche</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Alpha-Beta-Suche"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Alpha-Beta-Suche rootpage-Alpha-Beta-Suche skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Alpha-Beta-Suche</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<p>Die <b>Alpha-Beta-Suche</b> (auch <b>Alpha-Beta-Cut</b> oder <b>Alpha-Beta-Pruning</b> genannt) ist eine optimierte Variante des <a href="Minimax-Algorithmus" title="Minimax-Algorithmus">Minimax-Suchverfahrens</a>, also eines <a href="Algorithmus" title="Algorithmus">Algorithmus</a> zur Bestimmung eines optimalen Zuges bei Spielen mit zwei gegnerischen Parteien. Während der Suche werden zwei Werte – <i><a href="Alpha" title="Alpha">Alpha</a></i> und <i><a href="Beta" title="Beta">Beta</a></i> – aktualisiert, die angeben, welches Ergebnis die Spieler bei optimaler Spielweise erzielen können. Mit Hilfe dieser Werte kann entschieden werden, welche Teile des <a href="Suchbaum" title="Suchbaum">Suchbaumes</a> nicht untersucht werden müssen, weil sie das <a href="Kausalit%C3%A4t" title="Kausalität">Ergebnis</a> der Problemlösung nicht beeinflussen <i>können.</i>
</p><p>Die einfache (nicht optimierte) Alpha-Beta-Suche liefert exakt dasselbe Ergebnis wie die Minimax-Suche.
</p>

<div class="mw-heading mw-heading2"><h2 id="Informelle_Beschreibung">Informelle Beschreibung</h2></div>
<p>Der Minimax-Algorithmus analysiert den vollständigen Suchbaum. Dabei werden aber auch Knoten betrachtet, die in das Ergebnis (die Wahl des Zweiges an der Wurzel) nicht einfließen. Die Alpha-Beta-Suche ignoriert alle Knoten, von denen im Moment, da sie von der Suche erreicht werden, bereits feststeht, dass sie das Ergebnis nicht beeinflussen können.
</p><p>Ein anschauliches Beispiel für die Funktionsweise ist ein Zweipersonenspiel, bei dem der erste Spieler eine von mehreren Taschen auswählt und von seinem Gegenspieler den Gegenstand mit geringstem Wert aus dieser Tasche erhält. Der erste Spieler versucht also diejenige Tasche zu wählen, deren Gegenstand mit geringstem Wert immer noch mehr wert ist, als die geringsten Gegenstände aller anderen Taschen.
</p><p>Der Minimax-Algorithmus durchsucht für die Auswahl <i>alle</i> Taschen vollständig und benötigt somit viel Zeit. Die Alpha-Beta-Suche hingegen durchsucht zunächst nur die erste Tasche vollständig nach dem Gegenstand mit minimalem Wert. In allen weiteren Taschen wird nur solange gesucht, bis der Wert eines Gegenstands dieses Minimum erreicht oder unterschreitet. Dann steht fest, dass diese Tasche für den ersten Spieler nicht besser als die erste ist, und die Suche darin kann abgebrochen werden. Andernfalls ist diese Tasche eine bessere Wahl, und ihr neuer höherer minimaler Wert dient für die weitere Suche als neue Grenze.
</p><p>Ähnliche Situationen sind jedem Schachspieler vertraut, der gerade einen konkreten Zug darauf prüft, ob er ihm vorteilhaft erscheint. Findet er bei seiner Analyse des Zuges eine für sich selbst ungünstige Erwiderung des Gegners, dann wird er diesen Zug als „widerlegt“ ansehen und verwerfen. Es wäre sinnlos, noch weitere Erwiderungen des Gegners zu untersuchen, um festzustellen, ob der Gegner noch effektivere Widerlegungen besitzt und wie schlecht der betrachtete Zug tatsächlich ist.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Der_Algorithmus">Der Algorithmus</h2></div>
<p>Die Alpha-Beta-Suche arbeitet prinzipiell genauso wie obige informelle Beschreibung. Die Idee ist, dass zwei Werte (Alpha und Beta) weitergereicht werden, die das <a href="Worst_Case" title="Worst Case">Worst-Case-Szenario</a> der Spieler beschreiben. Der Alpha-Wert ist das Ergebnis, das Spieler A mindestens erreichen wird, der Beta-Wert ist das Ergebnis, das Spieler B höchstens erreichen wird. (Hier ist zu beachten, dass es für Spieler B darum geht, ein möglichst niedriges Ergebnis zu erhalten, da er ja „minimierend“ spielt!)
</p><p>Besitzt ein maximierender Knoten (von Spieler A) einen Zug, dessen Rückgabe den Beta-Wert überschreitet, wird die Suche in diesem Knoten abgebrochen (<i>Beta-<a href="Schnittregel" title="Schnittregel">Cutoff</a></i>, denn Spieler B würde A diese Variante erst gar nicht anbieten, weil sie sein bisheriges Höchst-Zugeständnis überschreiten würde). Liefert der Zug stattdessen ein Ergebnis, das den momentanen Alpha-Wert übersteigt, wird dieser entsprechend nach oben angehoben.
</p><p>Analoges gilt für die minimierenden Knoten, wobei bei Werten kleiner als Alpha abgebrochen wird <i>(Alpha-Cutoff)</i> und der Beta-Wert nach unten angepasst wird.
</p><p><span typeof="mw:File"></span>
</p><p>Obige Abbildung zeigt einen Beispielbaum mit 18 Blättern, von denen nur 12 ausgewertet werden. Die drei umrandeten Werte eines inneren Knotens beschreiben den Alpha-Wert, den Rückgabewert und den Beta-Wert.
</p><p>Der Suchalgorithmus verwendet ein sogenanntes Alpha-Beta-Fenster, dessen untere Grenze der Alpha-Wert und dessen obere Grenze der Beta-Wert darstellt. Dieses Fenster wird zu den Kindknoten weitergegeben, wobei in der Wurzel mit dem maximalen Fenster [-inf, inf] begonnen wird.
Die Blätter 1, 2 und 3 werden von einem maximierenden Knoten ausgewertet und der beste Wert 10 wird dem minimierenden <a href="Vaterknoten" class="mw-redirect" title="Vaterknoten">Vaterknoten</a> übergeben. Dieser passt den Beta-Wert an und übergibt das neue Fenster [-inf, 10] dem nächsten maximierenden <a href="Kindknoten" class="mw-redirect" title="Kindknoten">Kindknoten</a>, der die Blätter 4, 5 und 6 besitzt. Der Rückgabewert 12 von Blatt 5 ist aber so gut, dass er den Beta-Wert 10 überschreitet. Somit muss Blatt 6 nicht mehr betrachtet werden, weil das Ergebnis 12 dieses Teilbaumes besser ist als das des linken Teilbaumes und deshalb vom minimierenden Spieler nie gewählt werden würde.
</p><p>Ähnlich verhält es sich beim minimierenden Knoten mit dem 3-Alpha-Cutoff. Obwohl dieser Teilbaum erst teilweise ausgewertet wurde, ist klar, dass der maximierende Wurzelknoten diese Variante niemals wählen würde, weil der minimierende Knoten ein Ergebnis von <i>höchstens</i> 3 erzwingen könnte, während aus dem mittleren Teilbaum das Ergebnis 12 sichergestellt ist.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implementierung">Implementierung</h2></div>
<p>Anmerkung: Unterschiede zum einfachen <a href="Minimax-Algorithmus" title="Minimax-Algorithmus">Minimax-Algorithmus</a> sind gelb hinterlegt.
</p><p>Hauptprogramm (Auszug):
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">besterZug</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">NULL</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Suchtiefe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">bewertung</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max</span><span class="p">(</span><span class="n">Suchtiefe</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="o">-</span><span class="n">unendlich</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="n">unendlich</span><span class="p">);</span>
</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">besterZug</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">NULL</span><span class="p">)</span>
<span class="w"> </span><span class="n">es</span><span class="w"> </span><span class="n">gab</span><span class="w"> </span><span class="n">keine</span><span class="w"> </span><span class="n">weiteren</span><span class="w"> </span><span class="n">Zuege</span><span class="w"> </span><span class="nf">mehr</span><span class="w"> </span><span class="p">(</span><span class="n">Matt</span><span class="w"> </span><span class="n">oder</span><span class="w"> </span><span class="n">Patt</span><span class="p">);</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="nf">spiele</span><span class="p">(</span><span class="n">besterZug</span><span class="p">);</span>
</pre></div>
<p>Die normale Variante lautet:
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">tiefe</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">keineZuegeMehr</span><span class="p">(</span><span class="n">spieler_max</span><span class="p">))</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nf">bewerten</span><span class="p">();</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">maxWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">;</span>
</span><span class="w"> </span><span class="n">Zugliste</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">generiereMoeglicheZuege</span><span class="p">(</span><span class="n">spieler_max</span><span class="p">);</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nf">each</span><span class="w"> </span><span class="p">(</span><span class="n">Zug</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">Zugliste</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">fuehreZugAus</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">min</span><span class="p">(</span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="n">maxWert</span><span class="p">,</span><span class="w"> </span><span class="n">beta</span><span class="p">);</span>
</span><span class="w"> </span><span class="n">macheZugRueckgaengig</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">maxWert</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">maxWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Suchtiefe</span><span class="p">)</span>
<span class="w"> </span><span class="n">besterZug</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Zug</span><span class="p">;</span>
<span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">maxWert</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span>
</span><span class="hll"><span class="w"> </span><span class="k">break</span><span class="p">;</span>
</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">maxWert</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">tiefe</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">keineZuegeMehr</span><span class="p">(</span><span class="n">spieler_min</span><span class="p">))</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nf">bewerten</span><span class="p">();</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">minWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">beta</span><span class="p">;</span>
</span><span class="w"> </span><span class="n">Zugliste</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">generiereMoeglicheZuege</span><span class="p">(</span><span class="n">spieler_min</span><span class="p">);</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nf">each</span><span class="w"> </span><span class="p">(</span><span class="n">Zug</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">Zugliste</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">fuehreZugAus</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max</span><span class="p">(</span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="n">minWert</span><span class="p">);</span>
</span><span class="w"> </span><span class="n">macheZugRueckgaengig</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">minWert</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">minWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">minWert</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">alpha</span><span class="p">)</span>
</span><span class="hll"><span class="w"> </span><span class="k">break</span><span class="p">;</span>
</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">minWert</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Die NegaMax-Variante lautet:
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">miniMax</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">spieler</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tiefe</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="n">keineZuegeMehr</span><span class="p">(</span><span class="n">spieler</span><span class="p">))</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nf">bewerten</span><span class="p">(</span><span class="n">spieler</span><span class="p">);</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">maxWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">;</span>
</span><span class="w"> </span><span class="n">Zugliste</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">generiereMoeglicheZuege</span><span class="p">(</span><span class="n">spieler</span><span class="p">);</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nf">each</span><span class="w"> </span><span class="p">(</span><span class="n">Zug</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">Zugliste</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">fuehreZugAus</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">miniMax</span><span class="p">(</span><span class="o">-</span><span class="n">spieler</span><span class="p">,</span><span class="w"> </span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
<span class="hll"><span class="w"> </span><span class="o">-</span><span class="n">beta</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">maxWert</span><span class="p">);</span>
</span><span class="w"> </span><span class="n">macheZugRueckgaengig</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">maxWert</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">maxWert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Suchtiefe</span><span class="p">)</span>
<span class="w"> </span><span class="n">besterZug</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Zug</span><span class="p">;</span>
<span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">maxWert</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span>
</span><span class="hll"><span class="w"> </span><span class="k">break</span><span class="p">;</span>
</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">maxWert</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Während die Standard-Implementierung für einen Spieler maximiert und für den anderen Spieler minimiert, maximiert die Negamax-Variante für beide Spieler und vertauscht und negiert Alpha und Beta bei der Rekursion und betrachtet die Werte immer aus der Sicht des Spielers, der am Zug ist; positive Werte sind für diesen günstig, negative ungünstig. Daraus folgt, dass sich die Bewertungsfunktion in beiden Implementierungen unterschiedlich verhalten muss.
</p>
<ul><li>Standard-Implementierung: Die Brettstellung wird aus der Sicht des maximierenden Spielers bewertet (Funktion <i>bewerten()</i>). Wenn der maximierende Spieler besser steht, ist der Wert positiv.</li>
<li>Negamax-Implementierung: Bewertet wird aus der Sicht des Spielers, der jeweils am Zug ist. Darum wird die Funktion <i>bewerten(spieler)</i> mit dem ziehenden Spieler als Parameter aufgerufen.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Optimierungen">Optimierungen</h2></div>
<p>Kann man auf Grund der Komplexität des betrachteten Spiels den Spielbaum nur bis zu einer gewissen Tiefe berechnen, sind zwei Optimierungsansätze möglich. Zum einen kann die Bewertungsfunktion verbessert werden, zum anderen bietet der Alpha-Beta-Algorithmus selbst Optimierungspotential. Je besser die Bewertungsfunktion ist, desto weniger tief muss der Spielbaum betrachtet werden, um eine gewisse Spielstärke zu erlangen.
</p><p>Im Folgenden werden Optimierungen der Alpha-Beta-Suche dargestellt.
</p>
<div class="mw-heading mw-heading3"><h3 id="Vorsortierung_der_Züge"><span id="Vorsortierung_der_Z.C3.BCge"></span>Vorsortierung der Züge</h3></div>
<p>Anders als beim Minimax-Algorithmus spielt bei der Alpha-Beta-Suche die Reihenfolge, in der Kindknoten (Züge) bearbeitet werden, eine wesentliche Rolle. Je schneller das Alpha-Beta-Fenster verkleinert wird, desto mehr Varianten können abgeschnitten werden. Deshalb ist es wichtig, zuerst die Züge zu betrachten, die das beste Ergebnis versprechen. In der Praxis werden verschiedene <a href="Heuristik" title="Heuristik">Heuristiken</a> verwendet. Bei <a href="Schach" title="Schach">Schach</a> z.&nbsp;B. kann man die Züge danach sortieren, ob bzw. welche Figur geschlagen wird, oder auch welche Figur schlägt. „Turm schlägt Dame“ wird demnach vor „Turm schlägt Turm“ einsortiert und „Bauer schlägt Turm“ wird zwischen beiden einsortiert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Principal-Variation-Suche">Principal-Variation-Suche</h3></div>
<p>Ein Knoten bei der Alpha-Beta-Suche gehört einer von drei Kategorien an (bezogen auf die NegaMax-Variante):
</p>
<ul><li><i>Alpha-Knoten:</i> Jeder Folgezug liefert einen Wert kleiner oder gleich Alpha, was bedeutet, dass hier kein guter Zug möglich ist.</li>
<li><i>Beta-Knoten:</i> Mindestens ein Folgezug liefert einen Wert größer oder gleich Beta, was einen Cutoff bedeutet.</li>
<li><i>Principal-Variation-Knoten:</i> Mindestens ein Folgezug liefert einen Wert größer als Alpha, aber alle liefern einen Wert kleiner Beta.</li></ul>
<p>Manchmal kann man frühzeitig erkennen, um welchen Knoten es sich handelt. Liefert der erste getestete Folgezug einen Wert größer gleich Beta, dann ist es ein Beta-Knoten. Liefert er einen Wert kleiner gleich Alpha, dann ist es möglicherweise ein Alpha-Knoten (vorausgesetzt, die Züge sind gut vorsortiert). Liefert er aber einen Wert zwischen Alpha und Beta, so handelt sich möglicherweise um einen <i>Principal-Variation</i>-Knoten.
</p><p>Die Principal-Variation-Suche nimmt nun an, dass ein Folgezug, der einen Wert zwischen Alpha und Beta liefert, sich als bester möglicher Zug herausstellen wird. Deshalb wird das Alpha-Beta-Fenster im Folgenden auf das Minimum <i>(alpha, alpha+1)</i> verkleinert <i>(Nullfenster)</i>, um eine maximale Anzahl an Cutoffs zu erreichen, aber dennoch die verbleibenden Züge als schlechter zu beweisen.
</p><p>Wenn diese Nullfenstersuche einen Wert <i>w</i> größer <i>alpha</i> ergibt, dann ist entweder ein beta-Schnitt möglich (wenn <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle w\geq {\text{beta}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>w</mi>
<mo>≥<!-- ≥ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mtext>beta</mtext>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle w\geq {\text{beta}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/7cd7901e64a52f1698e2dd17113101ff051c1dcf.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:9.155ex; height:2.343ex;" alt="{\displaystyle w\geq {\text{beta}}}" loading="lazy"></span>), oder die Suche muss mit einem größeren Fenster wiederholt werden. Es genügt in diesem Fall das Fenster <i>(w, beta)</i>, da man aus der Nullfenstersuche schon weiß, dass der Wert des Zuges mindestens <i>w</i> ist.
</p><p>Die Spielprogramme werden in der Praxis noch mit etlichen Optimierungstechniken ausgestattet, zum Beispiel wird das aktuelle Suchfenster an die Bewertungsfunktion übergeben, damit eine vereinfachte und zeitsparende Bewertung erfolgen kann, wenn sich abzeichnet, dass der Blattwert weit außerhalb des Suchfensters liegt. Durch diese Technik, sowie durch spekulative und ebenfalls suchfensterabhängige Beschneidung des Suchbaums, hängt das Resultat, d.&nbsp;h. der Wert eines inneren Knotens, der mit der miniMax()-Funktion ermittelt wird, mehr oder weniger vom Suchfenster ab. Damit es nicht zu paradoxen Situationen kommt, indem etwa die Nullfenstersuche den Wert <i>w</i> liefert, aber die anschließende Wiederholungssuche mit dem Fenster <i>(w, beta)</i> einen Wert kleiner <i>w</i>, wird für die Wiederholungssuche oft das volle Suchfenster <i>(alpha, beta)</i> verwendet.
</p><p>Wegen der zuweilen nötigen Wiederholungssuche ist die Principal-Variation-Suche nur dann vorteilhaft, wenn die Züge gut vorsortiert wurden, weil dadurch Fehleinordnungen in eine der drei genannten Kategorien minimiert werden, d.&nbsp;h., es wird unwahrscheinlich, dass ein Folgezug einen besseren Wert als <i>alpha</i> hat und die Suche wiederholt werden muss. Andererseits können Principal-Variation-Knoten in Verbindung mit dem <i>Iterative Deepening</i> auch für die Vorsortierung der Züge verwendet werden.
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">AlphaBeta</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">tiefe</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">alpha</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span>
<span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tiefe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nf">Bewerten</span><span class="p">();</span>
<span class="w"> </span><span class="n">BOOL</span><span class="w"> </span><span class="n">PVgefunden</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">FALSE</span><span class="p">;</span>
<span class="w"> </span><span class="n">best</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">unendlich</span><span class="p">;</span>
<span class="w"> </span><span class="n">Zugliste</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GeneriereMoeglicheZuege</span><span class="p">();</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nf">each</span><span class="w"> </span><span class="p">(</span><span class="n">Zug</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">Zugliste</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="n">FuehreZugAus</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">PVgefunden</span><span class="p">)</span>
</span><span class="hll"><span class="w"> </span><span class="p">{</span>
</span><span class="hll"><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">AlphaBeta</span><span class="p">(</span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">alpha</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">alpha</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span>
</span><span class="hll"><span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">AlphaBeta</span><span class="p">(</span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">beta</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">wert</span><span class="p">);</span>
</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="n">wert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">AlphaBeta</span><span class="p">(</span><span class="n">tiefe</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">beta</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">alpha</span><span class="p">);</span>
<span class="w"> </span><span class="n">MacheZugRueckgaengig</span><span class="p">(</span><span class="n">Zug</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">best</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">beta</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="w"> </span><span class="n">best</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">wert</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">alpha</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wert</span><span class="p">;</span>
<span class="w"> </span><span class="n">PVgefunden</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TRUE</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">best</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Iterative_Tiefensuche_(Iterative_Deepening)"><span id="Iterative_Tiefensuche_.28Iterative_Deepening.29"></span>Iterative Tiefensuche <i>(Iterative Deepening)</i></h3></div>
<p>Die <i><a href="Iterative_Tiefensuche" title="Iterative Tiefensuche">iterative Tiefensuche</a></i> ist die schrittweise Erhöhung der Tiefe des Suchbaumes.
Da die Alpha-Beta-Suche eine <a href="Tiefensuche" title="Tiefensuche">Tiefensuche</a> ist, kann man meist vorher nicht bestimmen, wie lange die Berechnung dauern wird.
Deshalb beginnt man mit einer geringen Suchtiefe und erhöht diese schrittweise.
Das Ergebnis einer Berechnung kann benutzt werden, um bei erhöhter Suchtiefe die Züge besser vorzusortieren.
</p>
<div class="mw-heading mw-heading3"><h3 id="Aspiration_windows">Aspiration windows</h3></div>
<p><i>Aspiration windows</i> werden zusammen mit der <i>iterativen Tiefensuche</i> verwendet.
Grundsätzlich beginnt die Alpha-Beta-Suche an der Wurzel mit einem maximalen Fenster. Bei der iterativen Tiefensuche kann aber angenommen werden, dass eine neue Berechnung mit höherer Tiefe einen ähnlichen Ergebniswert liefern wird. Deshalb kann das Suchfenster initial auf einen (relativ) kleinen Bereich um den Ergebniswert der vorherigen Berechnung gesetzt werden. Stellt sich heraus, dass dieses Fenster zu klein war, muss (ähnlich wie bei der <i>Principal-Variation</i>-Suche) die Suche mit größerem oder maximalem Fenster wiederholt werden.
</p>
<div class="mw-heading mw-heading3"><h3 id="Killer-Heuristik">Killer-Heuristik</h3></div>
<p>Die <i>Killer-Heuristik</i> ist eine spezielle Art der Zugvorsortierung. Man nimmt hierbei an, dass Züge, die einen Cutoff verursacht haben, auch in anderen Teilen des Suchbaumes (bei gleicher Tiefe) einen Cutoff verursachen werden. Deshalb werden sie künftig immer zuerst betrachtet, sofern sie in der gerade betrachteten Spielposition gültige Züge darstellen. Diese Heuristik kann nicht bei allen Spielen sinnvoll angewendet werden, da die Aussicht darauf, dass diese so genannten <i>Killerzüge</i> auch in anderen Teilen des Suchbaumes noch gültige Züge sind, von der Art des Spiels abhängt.
</p>
<div class="mw-heading mw-heading3"><h3 id="Ruhesuche">Ruhesuche</h3></div>
<p>Bei der Alpha-Beta-Suche bzw. dem Minimax-Algorithmus ist es wenig günstig, wenn die Suche beim Erreichen einer <i>festen</i> Suchtiefe abgebrochen wird. Auf diese Weise könnte zum Beispiel beim Schach das Schlagen eines gedeckten Bauern durch die Dame als vorteilhaft erscheinen, wenn das Zurückschlagen unterhalb des Suchhorizonts liegen und daher vom Algorithmus „übersehen“ würde. Aus diesem Grund erfolgt der Übergang von der Alpha-Beta-Suche zur Bewertungsfunktion dynamisch, und zwar derart, dass unterhalb der Mindestsuchtiefe in Bezug auf die Bewertungsfunktion eine annähernde Konstanz abgewartet wird. Diese „Ruhe“ in Bezug auf die Werte der Bewertungsfunktion ist namensgebend für die Verfahrensweise, man spricht von einer <i>Ruhesuche</i> (<span style="font-style:normal;font-weight:normal"><a href="Englische_Sprache" title="Englische Sprache">englisch</a></span> <span lang="en-Latn" style="font-style:italic"><i>Quiescence search</i></span>). Beim Schach führt die Ruhesuche insbesondere dazu, dass ein Schlagabtausch bis zum Ende analysiert wird.
</p>
<div class="mw-heading mw-heading3"><h3 id="Null-Zug-Suche">Null-Zug-Suche</h3></div>
<p>Die <a href="Null-Zug-Suche" title="Null-Zug-Suche">Null-Zug-Suche</a> ist eine Optimierung, die sich die Tatsache zu Nutze macht, dass bei manchen Spielen (z.&nbsp;B. Schach) das Zugrecht von Vorteil ist.
</p>
<div class="mw-heading mw-heading2"><h2 id="Vergleich_von_Minimax_und_AlphaBeta">Vergleich von Minimax und AlphaBeta</h2></div>
<p>Nachfolgende Tabelle zeigt eine Beispielberechnung einer <a href="Schach" title="Schach">Schachstellung</a> bei konstanter Suchtiefe von vier Halbzügen (jeder Spieler zieht zweimal). Es wurde der normale Minimax-Algorithmus angewendet und Alpha-Beta ohne Zugsortierung und mit (einfacher) Zugsortierung. Die Prozentangabe bei den Cutoffs beziehen sich auf den gesamten Suchbaum und beschreibt, wie viel des gesamten Suchbaumes nicht ausgewertet wurde. Es handelt sich dabei um Schätzungen, denen zugrunde liegt, dass die Teilbäume in etwa gleich groß sind (bei Cutoffs ist nicht bekannt, wie groß der weggeschnittene Teilbaum wirklich wäre).
</p>
<table class="wikitable" style="text-align:right">
<tbody><tr>
<th>Algorithmus
</th>
<th>Bewertungen
</th>
<th>Cutoffs
</th>
<th>Anteil der Cutoffs
</th>
<th>Rechenzeit in Sekunden
</th></tr>
<tr>
<td>Minimax
</td>
<td>28.018.531
</td>
<td>0
</td>
<td>0,00&nbsp;%
</td>
<td>134,87 s
</td></tr>
<tr>
<td>AlphaBeta
</td>
<td>2.005.246
</td>
<td>136.478
</td>
<td>91,50&nbsp;%
</td>
<td>9,88 s
</td></tr>
<tr>
<td>AlphaBeta + Zugsortierung
</td>
<td>128.307
</td>
<td>27.025
</td>
<td>99,28&nbsp;%
</td>
<td>0,99 s
</td></tr></tbody></table>
<p>Es ist deutlich zu erkennen, dass die Alpha-Beta-Suche eine erhebliche Geschwindigkeitssteigerung gegenüber Minimax bedeutet. Auch die Zugsortierung verbessert die Rechenzeit in diesem Beispiel um den Faktor 10. Die Tatsache, dass mit Zugsortierung die Anzahl der Cutoffs absolut sinkt, lässt sich dadurch erklären, dass diese auf höheren Ebenen im Suchbaum erfolgen und somit größere Teile weggeschnitten werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p>Während die zentrale Bedeutung des Minimax-Algorithmus für die <a href="Schachprogramm" title="Schachprogramm">Schachprogrammierung</a> bereits von deren Pionieren <a href="Alan_Turing" title="Alan Turing">Alan Turing</a> und <a href="Claude_Shannon" title="Claude Shannon">Claude Shannon</a> in den 1940er-Jahren hervorgehoben wurde, liegen die Anfänge der Alpha-Beta-Suche in den späten 1950er-Jahren, wobei zunächst nur Alpha-Cutoffs verwendet wurden.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> Erst in den 1960er-Jahren wurde der Alpha-Beta-Algorithmus zum festen Bestandteil von Schachprogrammen. Eine erste, allerdings unveröffentlichte Beschreibung stammt aus dem Jahr 1963.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> <a href="Alexander_Lwowitsch_Brudno" title="Alexander Lwowitsch Brudno">Alexander Brudno</a> veröffentlichte 1963 eine genaue Beschreibung und einen mathematischen Beweis der Korrektheit der Alpha-Beta-Suche.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> Die erste ausführliche Untersuchung erschien 1975.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li><a href="J%C3%B6rg_Bewersdorff" title="Jörg Bewersdorff">Jörg Bewersdorff</a>: <i>Glück, Logik und Bluff. Mathematik im Spiel – Methoden, Ergebnisse und Grenzen.</i> 5. Auflage. Vieweg + Teubner, Wiesbaden 2010, ISBN 978-3-8348-0775-5, <a href="https://doi.org/10.1007/978-3-8348-9696-4" class="extiw external" title="doi:10.1007/978-3-8348-9696-4">doi:10.1007/978-3-8348-9696-4</a>, S. 177–197 (Kapitel 2.10).</li>
<li>Alexander Reinefeld: <i>Entwicklung der Spielbaum-Suchverfahren: Von Zuses Schachhirn zum modernen Schachcomputer.</i> In: <a href="Wolfgang_Reisig" title="Wolfgang Reisig">Wolfgang Reisig</a> &amp; Johann-Christoph Freytag (Hrsg.): <i>Informatik. Aktuelle Themen im historischen Kontext.</i> Springer, Berlin/Heidelberg/New York 2006, ISBN 978-3-540-32742-4, <a href="https://doi.org/10.1007/3-540-32743-6_11" class="extiw external" title="doi:10.1007/3-540-32743-6 11">doi:10.1007/3-540-32743-6_11</a>, S. 241–276.</li>
<li><a href="Wolfgang_Ertel_(Informatiker)" title="Wolfgang Ertel (Informatiker)">Wolfgang Ertel</a>: <i>Grundkurs Künstliche Intelligenz</i>: Eine praxisorientierte Einführung, <i>Computational Intelligence</i>. 4. Auflage. Springer Vieweg, Wiesbaden 2016, ISBN 978-3658135485, <a href="https://doi.org/10.1007/978-3-658-13549-2" class="extiw external" title="doi:10.1007/978-3-658-13549-2">doi:10.1007/978-3-658-13549-2</a>, S. 125–127.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li>Burkhard Monien, Ulf Lorenz &amp; Daniel Warner: <a rel="nofollow" class="external text" href="http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo19.php"><i>Der Alphabeta-Algorithmus für Spielbaumsuche</i>.</a> 2006.</li>
<li><a rel="nofollow" class="external text" href="http://ksquared.de/gamevisual/launch.php?agent=2">Visualisierung der Alpha-Beta-Suche als Java-Applet für beliebige Spielbäume</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Fußnoten"><span id="Fu.C3.9Fnoten"></span>Fußnoten</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Jörg Bewersdorff: <i>Glück, Logik und Bluff. Mathematik im Spiel – Methoden, Ergebnisse und Grenzen.</i> 5. Auflage. 2010, S. 184.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><a href="Allen_Newell" title="Allen Newell">Allen Newell</a>, J. C. Shaw &amp; <a href="Herbert_A._Simon" title="Herbert A. Simon">H. A. Simon</a>: <i>Chess-playing programs and the problem of complexity.</i> In: <i>IBM Journal of Research and Development.</i> Band 2, Heft 4, 1958, <a href="https://doi.org/10.1147/rd.24.0320" class="extiw external" title="doi:10.1147/rd.24.0320">doi:10.1147/rd.24.0320</a>, S. 330–335 (<a rel="nofollow" class="external text" href="https://aitopics.org/sites/default/files/classic/Feigenbaum_Feldman/C&amp;T-Newll-Shaw-Simon.pdf">PDF; 2,172&nbsp;MB</a>).</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text">D. J. Edwards &amp; T. P. Hart: <i><a rel="nofollow" class="external text" href="http://hdl.handle.net/1721.1/6098">The alpha-beta heuristic</a></i> (= <i>AI Memos.</i> 030). Massachusetts Institute of Technology, 1963 (<a rel="nofollow" class="external text" href="http://www.softwarepreservation.org/projects/LISP/MIT/AIM-30-Edwards_Hart-Alpha_Beta_Heuristic.pdf">PDF; 288 kB</a>).</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text">Brudno, A.L.: <cite style="font-style:italic">Bounds and valuations for shortening the search of estimates</cite>. In: <cite style="font-style:italic">Problems of Cybernetics</cite>. <span style="white-space:nowrap">Band<span style="display:inline-block;width:.2em">&nbsp;</span>10</span>, 1963, <span style="white-space:nowrap">S.<span style="display:inline-block;width:.2em">&nbsp;</span>225–241</span>.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Alpha-Beta-Suche&amp;rft.atitle=Bounds+and+valuations+for+shortening+the+search+of+estimates&amp;rft.au=Brudno%2C+A.L.&amp;rft.btitle=Problems+of+Cybernetics&amp;rft.date=1963&amp;rft.genre=book&amp;rft.pages=225-241&amp;rft.volume=10" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><a href="Donald_E._Knuth" title="Donald E. Knuth">Donald E. Knuth</a> &amp; Ronald W. Moore: <i>An analysis of alpha-beta Pruning.</i> In: <i>Artificial Intelligence.</i> Band 6, Heft 4, 1975, <a href="https://doi.org/10.1016/0004-3702(75)90019-3" class="extiw external" title="doi:10.1016/0004-3702(75)90019-3">doi:10.1016/0004-3702(75)90019-3</a>, S. 293–326</span>
</li>
</ol>
</div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-06-15" href="https://de.wikipedia.org/wiki/?title=Alpha-Beta-Suche&amp;oldid=256999689">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>